package main

import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)

// 全局变量 100张票
var ticket = 100
// 相当于 java中的 CountDownLatch
var wg sync.WaitGroup
// 创建锁头, 相当于java中的 synchronized
var mutex sync.Mutex

func main() {
	/*
	   4个goroutine，模拟4个售票口，4个子程序操作同一个共享数据。
	*/
	wg.Add(4)
	go saleTickets("售票窗口01")
	go saleTickets("售票窗口02")
	go saleTickets("售票窗口03")
	go saleTickets("售票窗口04")
	wg.Wait()
}

func saleTickets(name string)  {

	rand.Seed(time.Now().UnixNano())
	defer wg.Done()

	for {
		mutex.Lock()
		if ticket > 0{
			time.Sleep(time.Duration(rand.Intn(100)) *  time.Millisecond)
			fmt.Println(name, "售出 ---> ", ticket)
			ticket --
		} else {
			mutex.Unlock() //解锁
			fmt.Println(name, "售罄，没有票了....")
			break
		}
		//解锁
		mutex.Unlock()
	}

}
